Skip to content

Feat/oss product hardening - #67

Merged
wpak-ai merged 12 commits into
cppalliance:mainfrom
jonathanMLDev:feat/oss-product-hardening
May 13, 2026
Merged

Feat/oss product hardening#67
wpak-ai merged 12 commits into
cppalliance:mainfrom
jonathanMLDev:feat/oss-product-hardening

Conversation

@jonathanMLDev

@jonathanMLDev jonathanMLDev commented May 5, 2026

Copy link
Copy Markdown
Collaborator

OSS product hardening (configuration, resilience, unified query, CI)

Pull request: #67
Branch: feat/oss-product-hardening
Tracking issue (local): #71

Summary

This pull request hardens the TypeScript read-only Pinecone MCP server for real OSS and production use: centralized configuration (CLI + environment + defaults), safer multi-format logging with API key redaction, shared retry and abort-aware timeouts around Pinecone SDK calls, a single preset-driven query MCP tool (replacing separate fast/detailed variants), clearer guided-query orchestration, packaging and documentation updates, and a stronger CI matrix (coverage, Codecov, SBOM, Dependabot grouping).

Motivation

  • Operators need predictable configuration, tunable timeouts and cache TTL, and optional disabling of the suggestion flow without reading the source.
  • Hosts need logs that work in aggregators (JSON) and do not leak secrets.
  • Reliability under transient Pinecone failures requires consistent retry and cancellation semantics.
  • Clients benefit from one query contract (preset: fast | detailed | full) instead of multiple overlapping tools.

User-visible changes

MCP

  • Unified query tool with preset mapping to prior fast/detailed/full behaviors; guided_query preferred_tool supports auto, count, fast, detailed with routing aligned to suggestions.
  • Tool descriptions updated for count, suggest, query_documents, keyword search, and list namespaces.
  • list_namespaces may include expires_at_iso for cache transparency.
  • Keyword search results include document_id (legacy paper_number treated as deprecated where applicable).

CLI / process

  • --help, --version, and CLI overrides for key settings where implemented.
  • Entrypoint loads configuration early, applies log format/level, and avoids brittle process.exit patterns on recoverable paths (details in commits).

Configuration (environment)

New or expanded variables (names may match PINECONE_* or project-prefixed vars as in .env.example):

  • Sparse index name (hybrid / keyword index wiring).
  • Cache TTL seconds.
  • Suggestion flow disable flag.
  • Request timeout milliseconds.
  • Log format (text vs JSON).

See .env.example and README for the canonical list and semantics.

Library / types

  • PineconeClient and types updated for sparse index name, timeouts, normalized hit mapping, and discriminated results for keyword-index namespace listing where applicable.
  • Metadata filter validation extended for $in / $nin with string, number, or boolean arrays.

Docs and packaging

  • README: deployment model, configuration quick reference, Claude Desktop notes, comparison with the Python server, API flow updates for presets.
  • CHANGELOG: Unreleased section with breaking notes for MCP and library consumers.
  • .npmignore adjusted so published packages exclude bulky docs/ while shipping runtime artifacts.
  • Examples and .gitattributes / LF hygiene for Prettier and consistent checkouts.

CI

  • Matrix across Ubuntu, Windows, macOS and supported Node versions.
  • Coverage (Ubuntu + Node 20), Codecov upload, Vitest thresholds and excludes.
  • CycloneDX SBOM generation and artifact upload on the primary job.
  • Dependabot npm update groups for Vitest, TypeScript-ESLint, and ESLint/Prettier.

Breaking changes

  • MCP: Separate query_fast / query_detailed style tools are consolidated behind one query tool with preset. Update client configs and prompts that referenced old tool names.
  • Library: Consumers of PineconeClient and related types should follow CHANGELOG notes for constructor options, return shapes, and exports.

How to test

npm ci
npm run typecheck
npm run lint
npm run format:check
npm test
npm run test:coverage   # as used on CI where applicable

Manual smoke (optional): run the server with .env from .env.example, invoke list_namespaces, suggest_query_params, unified query with each preset, and guided_query with preferred_tool auto and explicit modes.

Checklist

  • Self-review completed
  • Documentation updated (README, CHANGELOG, .env.example)
  • Tests added or updated for retry, timeout, metadata filters, URL generators, and critical paths
  • CI workflow updated and passing on the matrix

Related

close #71

Summary by CodeRabbit

  • New Features

    • Added CLI interface with --help and --version flags.
    • Introduced configurable logging with text and JSON format options.
    • Unified query tool with preset-based control (fast, detailed, full modes).
    • Added custom URL generator registration for namespace-specific behavior.
    • Introduced canonical document_id field in query results.
  • Changes

    • Runtime configuration now driven by CLI arguments, environment variables, and defaults.
    • Namespace cache TTL is now configurable.
    • Enhanced API reliability with automatic retry and timeout handling for Pinecone operations.
  • Chores

    • Improved CI/CD tooling with SBOM generation and coverage reporting.
    • Updated documentation with configuration guides and deployment patterns.

@jonathanMLDev jonathanMLDev self-assigned this May 5, 2026
@coderabbitai

coderabbitai Bot commented May 5, 2026

Copy link
Copy Markdown

Warning

Rate limit exceeded

@jonathanMLDev has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 36 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: aed8f633-6a54-401d-b2d4-7aa94aec58e4

📥 Commits

Reviewing files that changed from the base of the PR and between d4cca71 and b56ed2e.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (18)
  • .github/workflows/ci.yml
  • CHANGELOG.md
  • README.md
  • package.json
  • src/cli.test.ts
  • src/cli.ts
  • src/config.ts
  • src/index.ts
  • src/server.test.ts
  • src/server.ts
  • src/server/config-context.ts
  • src/server/metadata-filter.ts
  • src/server/query-suggestion.ts
  • src/server/reassemble-documents.ts
  • src/server/suggestion-flow.ts
  • src/server/tools/guided-query-tool.ts
  • src/server/tools/suggest-query-params-tool.ts
  • src/server/url-generation.ts
📝 Walkthrough

Walkthrough

Centralizes runtime config with a CLI, adds retry/timeout primitives and tests, introduces multi-format redacting logs, refactors PineconeClient for sparse indexes and per-call timeouts with retry wrappers, unifies query tools into a preset-driven tool, expands server exports, and updates CI, packaging, docs, and examples.

Changes

Configuration, CLI, and Utility Foundation

Layer / File(s) Summary
Type Definitions
src/types.ts
PineconeClientConfig adds sparseIndexName and requestTimeoutMs; new QueryResultRowShape and KeywordIndexNamespacesResult types standardize query and sparse-index responses.
Configuration System
src/config.ts
ServerConfig consolidates runtime settings; resolveConfig() builds config from CLI/env/defaults; DEFAULT_REQUEST_TIMEOUT_MS exported.
CLI Parsing
src/cli.ts
parseCli() parses CLI flags and returns ParseCliResult; printHelp()/printVersion() added; numeric flags validated via parsePositiveInt().
Server Config Context
src/server/config-context.ts
Module-scoped cached config with setServerConfig() and lazy getServerConfig() to provide a single source of truth.
Retry and Timeout Utilities
src/server/retry.ts, src/server/retry.test.ts
Exports RetryOptions, TimeoutOptions, defaultShouldRetry(), withRetry() (exponential backoff), and withTimeout() (AbortController-based); unit tests cover retry/timeouts.

Logging and PineconeClient

Layer / File(s) Summary
Logging Enhancements
src/logger.ts
Adds LogFormat, setLogFormat/getLogFormat(), JSON/text rendering, redactApiKey() and deep redaction for structured data; formatMessage branches on format.
PineconeClient Refactor
src/pinecone-client.ts
Constructor uses config only, adds sparseIndexName/requestTimeoutMs, introduces runWithRetryTimeout() to wrap SDK calls, normalized hit mappers (extractHitContent, pineconeHitToSearchResult, mergedHitToSearchResult), safer merge/rerank flows, and listNamespacesFromKeywordIndex() returning KeywordIndexNamespacesResult.

Server, Tools, and Data Shapes

Layer / File(s) Summary
Entry Point & Server Wiring
src/index.ts, src/server.ts
index.ts is a thin composition root: dotenv early, CLI/config resolution, config validation, apply log settings, instantiate PineconeClient, and start server with setupServer(config); setupServer accepts optional ServerConfig and registers builtin URL generators.
Query Tools Consolidation
src/server/tools/query-tool.ts, src/server/tools/guided-query-tool.ts
Single query tool with preset (fast,detailed,full) maps to reranking/fields/mode; guided_query uses preferred_tool (auto/count/fast/detailed) resolved via helper.
Other Tools & Shapes
src/server/tools/*
count docs updated; keyword_search results include document_id; list_namespaces adds expires_at_iso; query_documents notes document-level reranking.
Result Shaping & Filters
src/server/format-query-result.ts, src/server/metadata-filter.ts
Adds canonical document_id with deprecated paper_number alias and one-time deprecation warning; $in/$nin accept arrays of JSON primitives; error messages enumerate allowed operators.
Caches & Suggestion Flow
src/server/namespaces-cache.ts, src/server/suggestion-flow.ts
Namespaces cache TTL now sourced from getServerConfig().cacheTtlMs; suggestion flow honors disableSuggestFlow, evicts by configured TTL, and exposes reset helpers for tests.

Sequence Diagram (high-level)

sequenceDiagram
  participant CLI
  participant Config as ConfigResolver
  participant Server
  participant Pinecone
  CLI->>Config: parseCli() -> resolveConfig()
  Config->>Server: provide ServerConfig
  Server->>Pinecone: PineconeClient.query/search (via runWithRetryTimeout)
  Pinecone-->>Server: results
  Server->>Server: normalize hits, rerank if needed
  Server->>CLI: MCP response
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • wpak-ai

"🐰 Configuration dreams and retry streams so clear,
Presets and timeouts, we hold them dear,
From CLI flags to logging redacted right,
This server now hums with resilient might!"

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 79.63% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Feat/oss product hardening' accurately reflects the main objective of the PR: hardening the Pinecone MCP server for OSS and production use through configuration centralization, resilience improvements, and packaging updates.
Linked Issues check ✅ Passed The PR successfully implements all major requirements from issue #71: centralized configuration with CLI/env precedence, CLI --help/--version support, text/JSON logging with API-key redaction, retry and timeout helpers with tests, unified query tool with presets, updated documentation and tooling, and CI enhancements across OS/Node matrix with coverage.
Out of Scope Changes check ✅ Passed All changes align with the stated objective of OSS product hardening. File modifications span configuration, logging, retry/timeout resilience, tool consolidation, documentation, packaging, CI workflow, and tests—all directly supporting the linked issue #71 requirements without introducing unrelated functionality.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

zho and others added 2 commits May 7, 2026 00:20
Co-authored-by: Cursor <cursoragent@cursor.com>
- Unify MCP query surface behind one tool with fast/detailed/full presets; update guided flow and docs.
- Abort-aware withTimeout (reject-before-abort race, swallow stray fn rejections); add retry tests.
- Pinecone client: shared hit mapping, keyword index namespace discriminated result, metadata filter and logger fixes; builtin URL generators register in setupServer.
- README/CHANGELOG/.npmignore align with packaging and deployment model; vitest excludes glue layers from coverage gates.

Co-authored-by: Cursor <cursoragent@cursor.com>
@jonathanMLDev
jonathanMLDev force-pushed the feat/oss-product-hardening branch from efcf64b to f2d89f8 Compare May 6, 2026 16:31
@codecov

codecov Bot commented May 6, 2026

Copy link
Copy Markdown

Welcome to Codecov 🎉

Once you merge this PR into your default branch, you're all set! Codecov will compare coverage reports and display results in all future pull requests.

Thanks for integrating Codecov - We've got you covered ☂️

@jonathanMLDev

Copy link
Copy Markdown
Collaborator Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented May 6, 2026

Copy link
Copy Markdown
✅ Actions performed

Full review triggered.

@jonathanMLDev

Copy link
Copy Markdown
Collaborator Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented May 12, 2026

Copy link
Copy Markdown
✅ Actions performed

Full review triggered.

Comment thread CHANGELOG.md Outdated
Comment thread CHANGELOG.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/server/suggestion-flow.ts (1)

5-6: ⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Update flow recommendation values to the new query preset contract.

Line 5 and Line 58 still emit legacy tool names (query_fast/query_detailed). With the unified query tool, this can propagate invalid guidance to callers and tool-routing logic.

Proposed contract update
 type FlowState = {
   updatedAt: number;
-  recommended_tool: 'count' | 'query_fast' | 'query_detailed';
+  recommended_tool: 'count' | 'fast' | 'detailed' | 'full';
   suggested_fields: string[];
   user_query: string;
 };
@@
       flow: {
         updatedAt: Date.now(),
-        recommended_tool: 'query_fast',
+        recommended_tool: 'fast',
         suggested_fields: [],
         user_query: '',
       },

Also applies to: 58-59

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/server/suggestion-flow.ts` around lines 5 - 6, The flow currently emits
legacy tool names (query_fast / query_detailed) via the recommended_tool field,
which must be unified to the new 'query' preset; update the type/union for
recommended_tool and any code paths that set recommended_tool (look for
references to recommended_tool and the function or block that builds the
suggestion object near the emission around lines 58-59) to return 'query'
instead of 'query_fast'/'query_detailed', and ensure callers/readers of
suggested_fields or suggestion objects accept the new 'query' value so routing
logic uses the unified tool name.
🧹 Nitpick comments (2)
src/server/url-generation.ts (1)

102-107: 💤 Low value

Consider setting the idempotent flag after successful registration.

The current implementation sets builtinGeneratorsRegistered = true before calling urlGenerators.set(...). If an exception occurs during registration (unlikely with Map.set, but possible in future modifications), the flag would indicate completion while the registry remains incomplete.

Best practice is to set the flag only after all registration operations succeed:

 export function registerBuiltinUrlGenerators(): void {
   if (builtinGeneratorsRegistered) return;
-  builtinGeneratorsRegistered = true;
   urlGenerators.set('mailing', generatorMailing);
   urlGenerators.set('slack-Cpplang', generatorSlackCpplang);
+  builtinGeneratorsRegistered = true;
 }

This ensures the guard reflects actual state even if the function is extended later.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/server/url-generation.ts` around lines 102 - 107, In
registerBuiltinUrlGenerators, move the mutation of builtinGeneratorsRegistered
so it is set to true only after all registrations succeed: perform
urlGenerators.set('mailing', generatorMailing) and
urlGenerators.set('slack-Cpplang', generatorSlackCpplang) first, then set
builtinGeneratorsRegistered = true; this ensures the guard reflects successful
completion and avoids marking the registry as initialized if an exception occurs
during registration.
CHANGELOG.md (1)

35-35: 💤 Low value

Simplify "API interface" to "API".

The phrase "identical API interface" is redundant since "API" stands for "Application Programming Interface." Consider:

-README "Comparison with Python Version" no longer claims an identical API interface; the new TypeScript-only tools
+README "Comparison with Python Version" no longer claims an identical API; the new TypeScript-only tools
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@CHANGELOG.md` at line 35, Update the changelog line that currently reads
"identical API interface" to use the non-redundant term "API" instead; edit the
sentence mentioning the new TypeScript-only tools (`guided_query`,
`query_documents`, `keyword_search`, `namespace_router`, `suggest_query_params`,
`count`, `generate_urls`) so it states they are listed explicitly and that the
README no longer claims an "identical API" (remove the word "interface").
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 12-17: The CI matrix currently only enumerates Node versions under
strategy.matrix.node-version while using a fixed runs-on value; update the
workflow to run an OS × Node matrix by adding strategy.matrix.os (e.g.,
["ubuntu-latest","windows-latest","macos-latest"]), change runs-on to use
matrix.os (runs-on: ${{ matrix.os }}), and keep or nest
strategy.matrix.node-version (node-version: [18.x,20.x,22.x]) so each OS is
tested across all Node versions; also scan the job for any OS-specific steps
that may need conditionals keyed on matrix.os and adjust them accordingly.

In `@README.md`:
- Around line 30-31: Update the top-level feature bullet describing the query
tool presets to list all supported values: change the text that currently reads
"`query` tool `preset=fast` / `detailed`" to include the unified `full` preset
(e.g., "`preset=fast | detailed | full`") so the README accurately reflects the
`query` tool's supported presets.

In `@src/cli.ts`:
- Around line 35-77: The CLI argument parsing currently treats any non-undefined
next token as a value, so flags like "--api-key --index-name foo" can corrupt
overrides; update the switch handling in the argument-parsing loop (the cases
for '--api-key', '--index-name', '--sparse-index-name', '--rerank-model',
'--top-k', '--log-level', '--log-format' and the later block around lines 79-94)
to only consume next when it is a legitimate value (e.g., next !== undefined &&
!next.startsWith('-')), and for '--top-k' additionally ensure parsePositiveInt
is only called when next is a valid non-flag token; apply this guarded
value-consumption pattern to all value-taking options to avoid accidentally
consuming subsequent flags.

In `@src/config.ts`:
- Around line 101-102: The config builder currently sets apiKey to an empty
string which yields an invalid ServerConfig later; update the
constructor/initializer that defines apiKey and indexName to validate required
values and throw an Error immediately when apiKey is missing (and similarly
validate indexName if it must be present). Specifically, in the block that
assigns apiKey and indexName (the variables named apiKey and indexName) and in
the repeated validation area around the ServerConfig creation (the later block
referenced around lines 125-137), replace silent defaults with explicit checks
that throw a clear error (e.g., "PINECONE_API_KEY is required") so the process
fails fast instead of returning an invalid ServerConfig.

In `@src/server/metadata-filter.ts`:
- Around line 36-41: The metadataFilterValueSchema is inconsistent with
isPrimitiveArray: isPrimitiveArray allows arrays of string|number|boolean but
metadataFilterValueSchema only permits string[] | number[]; update
metadataFilterValueSchema to accept boolean values as well (either add boolean[]
to the union or replace the array branch with an array of union(z.string(),
z.number(), z.boolean())) so the schema matches isPrimitiveArray's widened
primitive-array validation; ensure references to metadataFilterSchema continue
to use the updated metadataFilterValueSchema.

---

Outside diff comments:
In `@src/server/suggestion-flow.ts`:
- Around line 5-6: The flow currently emits legacy tool names (query_fast /
query_detailed) via the recommended_tool field, which must be unified to the new
'query' preset; update the type/union for recommended_tool and any code paths
that set recommended_tool (look for references to recommended_tool and the
function or block that builds the suggestion object near the emission around
lines 58-59) to return 'query' instead of 'query_fast'/'query_detailed', and
ensure callers/readers of suggested_fields or suggestion objects accept the new
'query' value so routing logic uses the unified tool name.

---

Nitpick comments:
In `@CHANGELOG.md`:
- Line 35: Update the changelog line that currently reads "identical API
interface" to use the non-redundant term "API" instead; edit the sentence
mentioning the new TypeScript-only tools (`guided_query`, `query_documents`,
`keyword_search`, `namespace_router`, `suggest_query_params`, `count`,
`generate_urls`) so it states they are listed explicitly and that the README no
longer claims an "identical API" (remove the word "interface").

In `@src/server/url-generation.ts`:
- Around line 102-107: In registerBuiltinUrlGenerators, move the mutation of
builtinGeneratorsRegistered so it is set to true only after all registrations
succeed: perform urlGenerators.set('mailing', generatorMailing) and
urlGenerators.set('slack-Cpplang', generatorSlackCpplang) first, then set
builtinGeneratorsRegistered = true; this ensures the guard reflects successful
completion and avoids marking the registry as initialized if an exception occurs
during registration.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 30030c30-5fc1-4e21-9a59-26e5d4d28308

📥 Commits

Reviewing files that changed from the base of the PR and between 2b05008 and d4cca71.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (41)
  • .env.example
  • .gitattributes
  • .github/dependabot.yml
  • .github/workflows/ci.yml
  • .gitignore
  • .npmignore
  • .prettierrc
  • CHANGELOG.md
  • README.md
  • examples/README.md
  • examples/custom-url-generator.ts
  • package.json
  • scripts/test-search.ts
  • src/cli.ts
  • src/config.ts
  • src/constants.ts
  • src/index.ts
  • src/logger.ts
  • src/pinecone-client.ts
  • src/server.test.ts
  • src/server.ts
  • src/server/config-context.ts
  • src/server/format-query-result.ts
  • src/server/metadata-filter.ts
  • src/server/namespaces-cache.ts
  • src/server/query-suggestion.ts
  • src/server/retry.test.ts
  • src/server/retry.ts
  • src/server/suggestion-flow.ts
  • src/server/tools/count-tool.ts
  • src/server/tools/guided-query-tool.ts
  • src/server/tools/keyword-search-tool.ts
  • src/server/tools/list-namespaces-tool.ts
  • src/server/tools/query-documents-tool.ts
  • src/server/tools/query-tool.ts
  • src/server/tools/suggest-query-params-tool.ts
  • src/server/url-generation.test.ts
  • src/server/url-generation.ts
  • src/types.ts
  • tsconfig.json
  • vitest.config.ts

Comment thread .github/workflows/ci.yml Outdated
Comment thread README.md Outdated
Comment thread src/cli.ts Outdated
Comment thread src/config.ts Outdated
Comment thread src/server/metadata-filter.ts
@jonathanMLDev
jonathanMLDev requested a review from wpak-ai May 13, 2026 19:43
@wpak-ai
wpak-ai merged commit c07279f into cppalliance:main May 13, 2026
12 checks passed
@jonathanMLDev
jonathanMLDev deleted the feat/oss-product-hardening branch May 14, 2026 17:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

OSS product hardening: configuration, resilience, unified query surface, and packaging

3 participants